package com.brush.framework.manager.factory;

import cn.hutool.extra.spring.SpringUtil;
import com.brush.common.constant.Constants;
import com.brush.common.utils.ServletUtils;
import com.brush.common.utils.ip.AddressUtils;
import com.brush.common.utils.ip.IpUtils;
import com.brush.system.domain.SysLogininfor;
import com.brush.system.domain.SysOperLog;
import com.brush.system.service.SysLogininforService;
import com.brush.system.service.SysOperLogService;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.extern.log4j.Log4j2;

import java.util.Date;
import java.util.TimerTask;

/**
 * 工厂方法( 生成timertask任务)
 */
@Log4j2
public class AsyncTimerTaskFactory {


    /**
     * 记录登录日志 （sys_logininfor） 数据库insert插入操作
     *
     * @param username
     * @param status
     * @param message
     * @param args
     * @return
     */
    public static TimerTask recordLogininfor(final String username, final String status, final String message,
                                             final Object... args) {
        // 拿到请求头中的 User-Agent
        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        final String ip = IpUtils.getIpAddr();
        final String address = AddressUtils.getRealAddressByIP(ip);

        return new TimerTask() {
            @Override
            public void run() {

                try {
                    //1、 收集数据
                    SysLogininfor sysLogininfor = new SysLogininfor();
                    sysLogininfor.setUserName(username);
                    sysLogininfor.setMsg(message);
                    sysLogininfor.setLoginTime(new Date());
                    //状态
                    if (status.equals(Constants.LOGIN_FAIL)) {
                        sysLogininfor.setStatus(Constants.FAIL);
                    } else {
                        sysLogininfor.setStatus(Constants.SUCCESS);
                    }

                    // 浏览器版本
                    sysLogininfor.setBrowser(userAgent.getBrowser().getName());

                    // 操作系统
                    sysLogininfor.setOs(userAgent.getOperatingSystem().getName());
                    // ip地址
                    sysLogininfor.setIpaddr(ip);
                    //获取IP的城市
                    sysLogininfor.setLoginLocation(address);

                    //2、向sys_logininfor插入数据
                    SysLogininforService bean = SpringUtil.getBean(SysLogininforService.class);
                    bean.save(sysLogininfor);

                } catch (Exception e) {
                    //记录日志
                    log.error("保存登录日志异步任务错误", e);
                    // 记录操作日志
                    StringBuilder s = new StringBuilder();
                    s.append(ip);
                    s.append("-");
                    s.append(address);
                    s.append("-");
                    s.append(username);
                    s.append("-");
                    s.append(status);
                    s.append("-");
                    s.append(message);
                    log.error(s.toString(), args);
                }
            }
        };

    }


    /**
     * 操作日志记录
     *
     * @param operLog 操作日志信息
     * @return 任务task
     */
    public static TimerTask recordOper(final SysOperLog operLog) {
        return new TimerTask() {
            @Override
            public void run() {
                // 远程查询操作地点
                operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
                SpringUtil.getBean(SysOperLogService.class).save(operLog);
            }
        };
    }

}
